package com.yanxiuhair.web.controller.demo.controller;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.Date;
import java.util.List;
import org.springframework.stereotype.Controller;
import org.springframework.ui.ModelMap;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.yanxiuhair.common.annotation.Excel;
import com.yanxiuhair.common.annotation.Excel.ColumnType;
import com.yanxiuhair.common.core.controller.BaseController;
import com.yanxiuhair.common.core.domain.AjaxResult;
import com.yanxiuhair.common.core.page.PageDomain;
import com.yanxiuhair.common.core.page.TableDataInfo;
import com.yanxiuhair.common.core.page.TableSupport;
import com.yanxiuhair.common.core.text.Convert;
import com.yanxiuhair.common.utils.DateUtils;
import com.yanxiuhair.common.utils.StringUtils;
import com.yanxiuhair.common.utils.poi.ExcelUtil;

/**
 * @ClassName:  DemoTableController   
 * @Description: 表格相关
 * @author: gaoxiaochuang   
 * @date:   2021年7月1日 下午5:57:34   
 *     
 * @Copyright: 2021 http://www.yanxiuhair.com/ Inc. All rights reserved. 
 * 注意：本内容仅限于许昌妍秀发制品有限公司内部传阅，禁止外泄以及用于其他的商业目
 */
@Controller
@RequestMapping("/demo/table")
public class DemoTableController extends BaseController {
	private String prefix = "demo/table";

	private final static List<UserTableModel> users = new ArrayList<UserTableModel>();
	{
		users.add(new UserTableModel(1, "1000001", "测试1", "0", "15888888888", "ry@qq.com", 150.0, "0"));
		users.add(new UserTableModel(2, "1000002", "测试2", "1", "15666666666", "ry@qq.com", 180.0, "1"));
		users.add(new UserTableModel(3, "1000003", "测试3", "0", "15666666666", "ry@qq.com", 110.0, "1"));
		users.add(new UserTableModel(4, "1000004", "测试4", "1", "15666666666", "ry@qq.com", 220.0, "1"));
		users.add(new UserTableModel(5, "1000005", "测试5", "0", "15666666666", "ry@qq.com", 140.0, "1"));
		users.add(new UserTableModel(6, "1000006", "测试6", "1", "15666666666", "ry@qq.com", 330.0, "1"));
		users.add(new UserTableModel(7, "1000007", "测试7", "0", "15666666666", "ry@qq.com", 160.0, "1"));
		users.add(new UserTableModel(8, "1000008", "测试8", "1", "15666666666", "ry@qq.com", 170.0, "1"));
		users.add(new UserTableModel(9, "1000009", "测试9", "0", "15666666666", "ry@qq.com", 180.0, "1"));
		users.add(new UserTableModel(10, "1000010", "测试10", "0", "15666666666", "ry@qq.com", 210.0, "1"));
		users.add(new UserTableModel(11, "1000011", "测试11", "1", "15666666666", "ry@qq.com", 110.0, "1"));
		users.add(new UserTableModel(12, "1000012", "测试12", "0", "15666666666", "ry@qq.com", 120.0, "1"));
		users.add(new UserTableModel(13, "1000013", "测试13", "1", "15666666666", "ry@qq.com", 380.0, "1"));
		users.add(new UserTableModel(14, "1000014", "测试14", "0", "15666666666", "ry@qq.com", 280.0, "1"));
		users.add(new UserTableModel(15, "1000015", "测试15", "0", "15666666666", "ry@qq.com", 570.0, "1"));
		users.add(new UserTableModel(16, "1000016", "测试16", "1", "15666666666", "ry@qq.com", 260.0, "1"));
		users.add(new UserTableModel(17, "1000017", "测试17", "1", "15666666666", "ry@qq.com", 210.0, "1"));
		users.add(new UserTableModel(18, "1000018", "测试18", "1", "15666666666", "ry@qq.com", 340.0, "1"));
		users.add(new UserTableModel(19, "1000019", "测试19", "1", "15666666666", "ry@qq.com", 160.0, "1"));
		users.add(new UserTableModel(20, "1000020", "测试20", "1", "15666666666", "ry@qq.com", 220.0, "1"));
		users.add(new UserTableModel(21, "1000021", "测试21", "1", "15666666666", "ry@qq.com", 120.0, "1"));
		users.add(new UserTableModel(22, "1000022", "测试22", "1", "15666666666", "ry@qq.com", 130.0, "1"));
		users.add(new UserTableModel(23, "1000023", "测试23", "1", "15666666666", "ry@qq.com", 490.0, "1"));
		users.add(new UserTableModel(24, "1000024", "测试24", "1", "15666666666", "ry@qq.com", 570.0, "1"));
		users.add(new UserTableModel(25, "1000025", "测试25", "1", "15666666666", "ry@qq.com", 250.0, "1"));
		users.add(new UserTableModel(26, "1000026", "测试26", "1", "15666666666", "ry@qq.com", 250.0, "1"));
	}

	private final static List<UserTableColumn> columns = new ArrayList<UserTableColumn>();
	{
		columns.add(new UserTableColumn("用户ID", "userId"));
		columns.add(new UserTableColumn("用户编号", "userCode"));
		columns.add(new UserTableColumn("用户姓名", "userName"));
		columns.add(new UserTableColumn("用户手机", "userPhone"));
		columns.add(new UserTableColumn("用户邮箱", "userEmail"));
		columns.add(new UserTableColumn("用户状态", "status"));
	}

	/**
	 * 搜索相关
	 */
	@GetMapping("/search")
	public String search() {
		return prefix + "/search";
	}

	/**
	 * 数据汇总
	 */
	@GetMapping("/footer")
	public String footer() {
		return prefix + "/footer";
	}

	/**
	 * 组合表头
	 */
	@GetMapping("/groupHeader")
	public String groupHeader() {
		return prefix + "/groupHeader";
	}

	/**
	 * 表格导出
	 */
	@GetMapping("/export")
	public String export() {
		return prefix + "/export";
	}

	/**
	 * 表格导出选择列
	 */
	@GetMapping("/exportSelected")
	public String exportSelected() {
		return prefix + "/exportSelected";
	}

	/**
	 * 导出数据
	 */
	@PostMapping("/exportData")
	@ResponseBody
	public AjaxResult exportSelected(UserTableModel userModel, String userIds) {
		List<UserTableModel> userList = new ArrayList<UserTableModel>(Arrays.asList(new UserTableModel[users.size()]));
		Collections.copy(userList, users);

		// 条件过滤
		if (StringUtils.isNotEmpty(userIds)) {
			userList.clear();
			for (Long userId : Convert.toLongArray(userIds)) {
				for (UserTableModel user : users) {
					if (user.getUserId() == userId) {
						userList.add(user);
					}
				}
			}
		}
		ExcelUtil<UserTableModel> util = new ExcelUtil<UserTableModel>(UserTableModel.class);
		return util.exportExcel(userList, "用户数据");
	}

	/**
	 * 翻页记住选择
	 */
	@GetMapping("/remember")
	public String remember() {
		return prefix + "/remember";
	}

	/**
	 * 跳转至指定页
	 */
	@GetMapping("/pageGo")
	public String pageGo() {
		return prefix + "/pageGo";
	}

	/**
	 * 自定义查询参数
	 */
	@GetMapping("/params")
	public String params() {
		return prefix + "/params";
	}

	/**
	 * 多表格
	 */
	@GetMapping("/multi")
	public String multi() {
		return prefix + "/multi";
	}

	/**
	 * 点击按钮加载表格
	 */
	@GetMapping("/button")
	public String button() {
		return prefix + "/button";
	}

	/**
	 * 直接加载表格数据
	 */
	@GetMapping("/data")
	public String data(ModelMap mmap) {
		mmap.put("users", users);
		return prefix + "/data";
	}

	/**
	 * 表格冻结列
	 */
	@GetMapping("/fixedColumns")
	public String fixedColumns() {
		return prefix + "/fixedColumns";
	}

	/**
	 * 自定义触发事件
	 */
	@GetMapping("/event")
	public String event() {
		return prefix + "/event";
	}

	/**
	 * 表格细节视图
	 */
	@GetMapping("/detail")
	public String detail() {
		return prefix + "/detail";
	}

	/**
	 * 表格父子视图
	 */
	@GetMapping("/child")
	public String child() {
		return prefix + "/child";
	}

	/**
	 * 表格图片预览
	 */
	@GetMapping("/image")
	public String image() {
		return prefix + "/image";
	}

	/**
	 * 动态增删改查
	 */
	@GetMapping("/curd")
	public String curd() {
		return prefix + "/curd";
	}

	/**
	 * 表格行拖拽操作
	 */
	@GetMapping("/reorderRows")
	public String reorderRows() {
		return prefix + "/reorderRows";
	}

	/**
	 * 表格列拖拽操作
	 */
	@GetMapping("/reorderColumns")
	public String reorderColumns() {
		return prefix + "/reorderColumns";
	}

	/**
	 * 表格列宽拖动
	 */
	@GetMapping("/resizable")
	public String resizable() {
		return prefix + "/resizable";
	}

	/**
	 * 表格行内编辑操作
	 */
	@GetMapping("/editable")
	public String editable() {
		return prefix + "/editable";
	}

	/**
	 * 主子表提交
	 */
	@GetMapping("/subdata")
	public String subdata() {
		return prefix + "/subdata";
	}

	/**
	 * 表格自动刷新
	 */
	@GetMapping("/refresh")
	public String refresh() {
		return prefix + "/refresh";
	}

	/**
	 * 表格打印配置
	 */
	@GetMapping("/print")
	public String print() {
		return prefix + "/print";
	}

	/**
	 * 表格标题格式化
	 */
	@GetMapping("/headerStyle")
	public String headerStyle() {
		return prefix + "/headerStyle";
	}

	/**
	 * 表格动态列
	 */
	@GetMapping("/dynamicColumns")
	public String dynamicColumns() {
		return prefix + "/dynamicColumns";
	}

	/**
	 * 自定义视图分页
	 */
	@GetMapping("/customView")
	public String customView() {
		return prefix + "/customView";
	}

	/**
	 * 表格其他操作
	 */
	@GetMapping("/other")
	public String other() {
		return prefix + "/other";
	}

	/**
	 * 动态获取列
	 */
	@PostMapping("/ajaxColumns")
	@ResponseBody
	public AjaxResult ajaxColumns(UserTableColumn userColumn) {
		List<UserTableColumn> columnList = new ArrayList<UserTableColumn>(
				Arrays.asList(new UserTableColumn[columns.size()]));
		Collections.copy(columnList, columns);
		if (userColumn != null && "userBalance".equals(userColumn.getField())) {
			columnList.add(new UserTableColumn("用户余额", "userBalance"));
		}
		return AjaxResult.success(columnList);
	}

	/**
	 * 查询数据
	 */
	@PostMapping("/list")
	@ResponseBody
	public TableDataInfo list(UserTableModel userModel) {
		TableDataInfo rspData = new TableDataInfo();
		List<UserTableModel> userList = new ArrayList<UserTableModel>(Arrays.asList(new UserTableModel[users.size()]));
		Collections.copy(userList, users);
		// 查询条件过滤
		if (StringUtils.isNotEmpty(userModel.getUserName())) {
			userList.clear();
			for (UserTableModel user : users) {
				if (user.getUserName().equals(userModel.getUserName())) {
					userList.add(user);
				}
			}
		}
		PageDomain pageDomain = TableSupport.buildPageRequest();
		if (null == pageDomain.getPageNum() || null == pageDomain.getPageSize()) {
			rspData.setRows(userList);
			rspData.setTotal(userList.size());
			return rspData;
		}
		Integer pageNum = (pageDomain.getPageNum() - 1) * 10;
		Integer pageSize = pageDomain.getPageNum() * 10;
		if (pageSize > userList.size()) {
			pageSize = userList.size();
		}
		rspData.setRows(userList.subList(pageNum, pageSize));
		rspData.setTotal(userList.size());
		return rspData;
	}
}

class UserTableColumn {
	/** 表头 */
	private String title;
	/** 字段 */
	private String field;

	public UserTableColumn() {

	}

	public UserTableColumn(String title, String field) {
		this.title = title;
		this.field = field;
	}

	public String getTitle() {
		return title;
	}

	public void setTitle(String title) {
		this.title = title;
	}

	public String getField() {
		return field;
	}

	public void setField(String field) {
		this.field = field;
	}
}

class UserTableModel {
	/** 用户ID */
	private int userId;

	/** 用户编号 */
	@Excel(name = "用户编号", cellType = ColumnType.NUMERIC)
	private String userCode;

	/** 用户姓名 */
	@Excel(name = "用户姓名")
	private String userName;

	/** 用户性别 */
	private String userSex;

	/** 用户手机 */
	@Excel(name = "用户手机")
	private String userPhone;

	/** 用户邮箱 */
	@Excel(name = "用户邮箱")
	private String userEmail;

	/** 用户余额 */
	@Excel(name = "用户余额", cellType = ColumnType.NUMERIC)
	private double userBalance;

	/** 用户状态（0正常 1停用） */
	private String status;

	/** 创建时间 */
	@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
	private Date createTime;

	public UserTableModel() {

	}

	public UserTableModel(int userId, String userCode, String userName, String userSex, String userPhone,
			String userEmail, double userBalance, String status) {
		this.userId = userId;
		this.userCode = userCode;
		this.userName = userName;
		this.userSex = userSex;
		this.userPhone = userPhone;
		this.userEmail = userEmail;
		this.userBalance = userBalance;
		this.status = status;
		this.createTime = DateUtils.getNowDate();
	}

	public int getUserId() {
		return userId;
	}

	public void setUserId(int userId) {
		this.userId = userId;
	}

	public String getUserCode() {
		return userCode;
	}

	public void setUserCode(String userCode) {
		this.userCode = userCode;
	}

	public String getUserName() {
		return userName;
	}

	public void setUserName(String userName) {
		this.userName = userName;
	}

	public String getUserSex() {
		return userSex;
	}

	public void setUserSex(String userSex) {
		this.userSex = userSex;
	}

	public String getUserPhone() {
		return userPhone;
	}

	public void setUserPhone(String userPhone) {
		this.userPhone = userPhone;
	}

	public String getUserEmail() {
		return userEmail;
	}

	public void setUserEmail(String userEmail) {
		this.userEmail = userEmail;
	}

	public double getUserBalance() {
		return userBalance;
	}

	public void setUserBalance(double userBalance) {
		this.userBalance = userBalance;
	}

	public String getStatus() {
		return status;
	}

	public void setStatus(String status) {
		this.status = status;
	}

	public Date getCreateTime() {
		return createTime;
	}

	public void setCreateTime(Date createTime) {
		this.createTime = createTime;
	}
}
